再開可能なタスク

[scheduler.resumable_tasks]

タスクの実行を一時停止して後に再開するように通知する機能。


// <oneapi/tbb/task.h> ヘッダーで定義 

using oneapi::tbb::task::suspend_point = /* implementation-defined */; 
template < typename Func > void oneapi::tbb::task::suspend( Func ); 
void oneapi::tbb::task::resume( oneapi::tbb::task::suspend_point );

要件:

  • Func タイプは、SuspendFunc 要件を満たしている必要があります。

実行中のタスクで呼び出された oneapi::tbb::task::suspend 関数は、タスクの実行を一時停止し、スレッドを切り替えて他の oneTBB 並列ワークに参加します。この関数は、現在の実行コンテキスト oneapi::tbb::task::suspend_point を引数として持つユーザー呼び出し可能なオブジェクトを受け入れます。ユーザー指定の呼び出し可能オブジェクトは、呼び出し元のスレッドで実行されます。

oneapi::tbb::task::suspend_point コンテキスト・タグを oneapi::tbb::task::resume 関数に渡して、中断されたポイントでプログラムの実行をトリガーする必要があります。oneapi::tbb::task::resume 関数は、アプリケーションの別スレッドの任意のポイントを呼び出すことができます。この関数は、タスク・スケジューラーのシグナルとして機能します。

oneapi::tbb::task::suspend を呼び出したスレッドが、中断された後に実行を継続する保証はありません。だたし、これらの保証は、最も外側のブロックの oneTBB 呼び出し (oneapi::tbb::parallel_foroneapi::tbb::flow::graph::wait_for_all) および oneapi::tbb::task_arena::execute 呼び出しに適用されます。


// 並列計算領域 
oneapi::tbb::parallel_for(0, N, [&](int) { 
    // 現在のタスクの実行を停止し、コンテキストを取得します 
    oneapi::tbb::task::suspend([&] (oneapi::tbb::task::suspend_point tag) { 
        // 非同期要求を処理する専用のユーザー管理アクティビティー。 
        async_activity.submit(tag); // OpenCL/IO/データベース/ネットワークなどの可能性があります。 
    }); // この関数の後に実行が再開されます 
});

// 専用ユーザー管理アクティビティー: 

// 専用のユーザー管理アクティビティーから、 
// oneapi::tbb::task::suspend_point によって参照されるタスクの実行を再開するシグナル 
oneapi::tbb::task::resume(tag);